home *** CD-ROM | disk | FTP | other *** search
/ PC World Interactive 7 / PC World Interactive 7.iso / program / ctutor.exe / TEXT / CHAP08.TXT < prev    next >
Text File  |  1994-05-15  |  23KB  |  464 lines

  1.  
  2.  
  3.  
  4.                                                         Chapter 8
  5.                                                          POINTERS
  6.  
  7.  
  8. WHAT IS A POINTER?
  9. -----------------------------------------------------------------
  10. Simply stated, a pointer is an address.           ===============
  11. Instead of being a variable, it is a pointer to      POINTER.C
  12. a variable stored somewhere in the address        ===============
  13. space of the program.  It is always best to use 
  14. an example so load the file named POINTER.C and display it on 
  15. your monitor for an example of a program with some pointers 
  16. in it.
  17.  
  18. For the moment, ignore the data declaration statement where we 
  19. define index and two other fields beginning with a star.  It is 
  20. properly called an asterisk, but for reasons we will see later, 
  21. let's agree to call it a star.  If you observe the statement in 
  22. line 8, it should be clear that we assign the value of 39 to the 
  23. variable named index.  This is no surprise, we have been doing it 
  24. for several programs now.  The statement in line 9 however, says 
  25. to assign to pt1 a strange looking value, namely the variable 
  26. index with an ampersand in front of it.  In this example, pt1 and 
  27. pt2 are pointers, and the variable named index is a simple 
  28. variable.  Now we have a problem similar to the old chicken and 
  29. egg problem.  We need to learn how to use pointers in a program, 
  30. but to do so requires that first we define the means of using the 
  31. pointers in the program.
  32.  
  33. The following two rules will be somewhat confusing to you at 
  34. first, but we need to state the definitions before we can use 
  35. them.  Take your time, and the whole thing will clear up very 
  36. quickly.
  37.  
  38.  
  39. TWO VERY IMPORTANT RULES
  40. -----------------------------------------------------------------
  41. The following two rules are very important when using pointers 
  42. and must be thoroughly understood.
  43.  
  44. 1.  A variable name with an ampersand in front of it defines the 
  45.     address of the variable and therefore points to the variable.  
  46.     You can therefore read line nine as "pt1 is assigned the 
  47.     value of the address of index". 
  48.  
  49. 2.  A pointer with a star in front of it refers to the value of 
  50.     the variable pointed to by the pointer.  Line twelve of the 
  51.     program can be read as "The stored (starred) value to which 
  52.     the pointer pt1 points is assigned the value 13".  Now you 
  53.     can see why it is convenient to think of the asterisk as a 
  54.     star,  it sort of sounds like the word store.
  55.  
  56.  
  57.                                                          Page 8-1
  58.  
  59.                                              Chapter 8 - Pointers
  60.  
  61. MEMORY AIDS
  62. -----------------------------------------------------------------
  63. 1.  Think of & as an address.
  64.  
  65. 2.  Think of * as a star referring to stored.
  66.  
  67. Assume for the moment that pt1 and pt2 are pointers (we will see 
  68. how to define pointers shortly).  As pointers, they do not 
  69. contain a variable value but an address of a variable and can be 
  70. used to point to a variable.  Figure 8-1 is a graphical 
  71. representation of the data space as it is configured just prior 
  72. to executing line 8.  A box represents a variable, and a box 
  73. with a dot in it represents a pointer.  At this time the pointers 
  74. are not pointing at anything, so they have no arrows emanating 
  75. from the boxes.  Executing line 8 stores the value 39 in index.
  76.  
  77. Continuing execution of the program, we come to line 9 which 
  78. assigns the address of the variable index to the pointer pt1.  
  79. Since we have a pointer to index, we can manipulate the value of 
  80. index by using either the variable name itself, or the pointer.  
  81. Figure 8-2 depicts the condition of the data space after 
  82. executing line 9 of the program.Jumping ahead a little in the 
  83. program, line 12 modifies the value of index by using the 
  84. pointer.  Since the pointer pt1 points to the variable named 
  85. index, putting a star in front of the pointer name refers to the 
  86. memory location to which it is pointing.  Line 12 therefore 
  87. assigns the value of 13 to index.  Anyplace in the program where 
  88. it is permissible to use the variable name index, it is also 
  89. permissible to use the name *pt1 since they are identical in 
  90. meaning until the pointer is reassigned to some other variable.
  91.  
  92.  
  93. ANOTHER POINTER
  94. -----------------------------------------------------------------
  95. Just to add a little intrigue to the system, we have another 
  96. pointer defined in this program, pt2.  Since pt2 has not been 
  97. assigned a value prior to statement 10, it doesn't point to 
  98. anything, it contains garbage.  Of course, that is also true of 
  99. any variable until a value is assigned to it.  The statement in 
  100. line 10 assigns pt2 the same address as pt1, so that now pt2 also 
  101. points to the variable named index.  We have copied the address 
  102. from one pointer to another pointer.  To continue the definition 
  103. from the last paragraph, anyplace in the program where it is 
  104. permissible to use the variable index, it is also permissible to 
  105. use the name *pt2 because they  are now identical in meaning.  
  106. This fact is illustrated in the printf() statement in line 11 
  107. since this statement uses the three means of identifying the same 
  108. variable to print out the same variable three times.  Refer to 
  109. figure 8-3 for the representation of the data space at this time.
  110.  
  111.  
  112.  
  113.  
  114.  
  115.                                                          Page 8-2
  116.  
  117.                                              Chapter 8 - Pointers
  118.  
  119. THERE IS ONLY ONE VARIABLE
  120. -----------------------------------------------------------------
  121. Note carefully that, even though it appears that there are three 
  122. variables, there is really only one variable.  The two pointers 
  123. point to the single variable.  This is illustrated in the 
  124. statement in line 12 which assigns the value of 13 to the 
  125. variable index, because that is where the pointer pt1 is 
  126. pointing.  The printf() statement in line 13 causes the new value 
  127. of 13 to be printed out three times.  Keep in mind that there is 
  128. really only one variable to be changed or printed, not three.  We 
  129. do have three aliases for the one variable, index, *pt1, and *pt2.  
  130. Figure 8-4 is the graphical representation of the data space at 
  131. this time.
  132.  
  133. This is admittedly a very difficult concept, but since it is used 
  134. extensively in all but the most trivial C programs, it is well 
  135. worth your time to stay with this material until you understand 
  136. it thoroughly.
  137.  
  138.  
  139. HOW DO YOU DECLARE A POINTER?
  140. -----------------------------------------------------------------
  141. Now to keep a promise and tell you how to define a pointer.  
  142. Refer to line 6 of the program and you will see our old familiar 
  143. way of defining the variable index, followed by two more 
  144. definitions.  The second definition can be read as "the storage 
  145. location to which pt1 points will be an int type variable".  
  146. Therefore, pt1 is a pointer to an int type variable.  Likewise, 
  147. pt2 is another pointer to an int type variable, because it has a 
  148. star (asterisk) in front of it.  These pointers can point to the 
  149. same int variable or to two different int variables.
  150.  
  151. A pointer must be defined to point to a specific type of 
  152. variable.  Following a proper definition, it cannot be used to 
  153. point to any other type of variable or it will result in a type 
  154. incompatibility error.  In the same manner that a float type of 
  155. variable cannot be added to an int type variable, a pointer to a 
  156. float variable cannot be used to point to an integer variable 
  157. without some major problems.
  158.  
  159. Compile and run this program and observe that there is only one 
  160. variable and the single statement in line 12 changes the one 
  161. variable which is displayed three times.  This material is so 
  162. important that you should review it carefully if you do not fully 
  163. understand it at this time. It would be a good exercise for you 
  164. to draw the graphics yourself as you review the code for this 
  165. program.
  166.  
  167.  
  168.  
  169.  
  170.  
  171.  
  172.  
  173.                                                          Page 8-3
  174.  
  175.                                              Chapter 8 - Pointers
  176.  
  177. THE SECOND PROGRAM WITH POINTERS
  178. -----------------------------------------------------------------
  179. In these few pages so far on pointers, we have   ================
  180. covered a lot of territory, but it is important     POINTER2.C
  181. territory.  We still have a lot of material to   ================
  182. cover so stay in tune as we continue this 
  183. important aspect of C.  Load the next file named POINTER2.C and 
  184. display it on your monitor so we can continue our study.  In this 
  185. program we have defined several variables and two pointers.  The 
  186. first pointer named there is a pointer to a char type variable 
  187. and the second named pt points to an int type variable.  Notice 
  188. also that we have defined two array variables named strg and 
  189. list.  We will use them to show the correspondence between 
  190. pointers and array names.
  191.  
  192. Figure 8-5 depicts the data just prior to executing line 10.  
  193. There are three variables, two pointers, a string, and an array 
  194. of ints, or we could say there are three variables, two pointers, 
  195. and two arrays.  Each array is composed of the array itself and a 
  196. pointer which points to the beginning of the array according to 
  197. the definition of an array in C.  This will be completely defined 
  198. in the next paragraph.  Each array is composed of a number of 
  199. identical elements of which only a few at the beginning and a few 
  200. at the end are depicted graphically for convenience.
  201.  
  202.                
  203. AN ARRAY VARIABLE IS ACTUALLY A POINTER
  204. -----------------------------------------------------------------
  205. In the programming language C, an array variable is defined to be 
  206. simply a pointer to the beginning of the array.  This will take 
  207. some explaining.  Refer to the example program on your monitor.  
  208. You will notice that in line 10 we assign a string constant to 
  209. the string variable named strg so we will have some data to work 
  210. with.  Next, we assign the value of the first element to the 
  211. variable one, a simple char variable.  Next, since the string 
  212. name is a pointer to the first element of the string, by 
  213. definition of the C language, we can assign the same value to two 
  214. by using the star and the string name (*strg).  Observe that the 
  215. box with a dot pointing to a variable can be used to access the 
  216. variable just like in the last program.  The result of the two 
  217. assignments are such that one now has the same value as two, and 
  218. both contain the character T, the first character in the string.  
  219. Note that it would be incorrect to write line 10 as 
  220. two = *strg[0]; because the star takes the place of the square 
  221. brackets.
  222.  
  223. For all practical purposes, strg is a pointer to a char type 
  224. variable.  It does, however, have one restriction that a true 
  225. pointer does not have.  It cannot be changed like a variable, but 
  226. must always contain the address of the first element of the 
  227. string and therefore always points to its string.  It could be 
  228. thought of as a pointer constant.  Even though it cannot be 
  229. changed, it can be used to refer to other values than the one it 
  230.  
  231.                                                          Page 8-4
  232.  
  233.                                              Chapter 8 - Pointers
  234.  
  235. is defined to point to, as we will see in the next section of the 
  236. program.
  237.  
  238. Moving ahead to line 16, the variable one is assigned the value 
  239. of the ninth character in the string (since the indexing starts 
  240. at zero) and two is assigned the same value because we are 
  241. allowed to index a pointer to get to values farther ahead in the 
  242. string.  Both variables now contain the character a.  Line 17 
  243. says to add 8 to the value of the pointer strg, then get the 
  244. value stored at that location and store it in the variable two.
  245.  
  246.  
  247. POINTER INDEXING
  248. -----------------------------------------------------------------
  249. The C programming language takes care of indexing for us 
  250. automatically by adjusting the indexing for the type of variable 
  251. the pointer is pointing to.  In this case, the index of 8 is 
  252. simply added to the pointer value before looking up the desired 
  253. result because a char type variable is one byte long.  If we were 
  254. using a pointer to an int type variable, the index would be 
  255. doubled and added to the pointer before looking up the value 
  256. because an int type variable uses two bytes per value stored on 
  257. most microcomputers.  When we get to the chapter on structures, 
  258. we will see that a variable can have many, even into the hundreds 
  259. or thousands, of bytes per variable, but the indexing will be 
  260. handled automatically for us by the system.
  261.  
  262. The data space is now in the state defined graphically in figure 
  263. 8-6.  The string named strg has been filled and the two variables 
  264. named one and two have the letter "a" stored in them.  Since the 
  265. pointer variable there is already a pointer, it can be assigned 
  266. the address of the 11th element of strg by the statement in line 
  267. 20 of this program.  Remember that since there is a pointer to 
  268. type char, it can be assigned any value as long as that value 
  269. represents a char type of address.  It should be clear that the 
  270. pointers must be typed in order to allow the pointer arithmetic 
  271. described in the last paragraph to be done properly.  The third 
  272. and fourth outputs will be the same, namely the letter c.
  273.  
  274.  
  275. POINTER ARITHMETIC
  276. -----------------------------------------------------------------
  277. Not all forms of arithmetic are permissible on a pointer.  Only 
  278. those things that make sense, considering that a pointer is an 
  279. address somewhere in the computer.  It would make sense to add a 
  280. constant to an address, thereby moving it ahead in memory that 
  281. number of places.  Likewise, subtraction is permissible, moving 
  282. it back some number of locations.  Adding two pointers together 
  283. would not make sense because absolute memory addresses are not 
  284. additive.  Pointer multiplication is also not allowed, as that 
  285. would be a funny number.  If you think about what you are 
  286. actually doing, it will make sense to you what is allowed, and 
  287. what is not.
  288.  
  289.                                                          Page 8-5
  290.  
  291.                                              Chapter 8 - Pointers
  292.  
  293. NOW FOR AN INTEGER POINTER
  294. -----------------------------------------------------------------
  295. The array named list is assigned a series of values from 100 to 
  296. 199 in order to have some data to work with in lines 24 and 25.  
  297. Next, we assign the pointer pt the address of the 28th element of 
  298. the list and print out the same value both ways to illustrate 
  299. that the system truly will adjust the index for the int type 
  300. variable.  You should spend some time in this program until you 
  301. feel you fairly well understand these lessons on pointers.
  302.  
  303. Compile and execute POINTER2.C and study the output.  At the 
  304. termination of execution, the data space will be as depicted in 
  305. figure 8-7.  Once again, it would be a good exercise for you to 
  306. attempt to draw the graphic for this program as you review the 
  307. code.
  308.  
  309.  
  310. FUNCTION DATA RETURN WITH A POINTER
  311. -----------------------------------------------------------------
  312. You may recall that back in the lesson on        ================
  313. functions we mentioned that there were two           TWOWAY.C
  314. ways to get variable data back from a            ================
  315. function.  One way is through use of the 
  316. array, and you should be right on the verge of guessing the other 
  317. way.  If your guess is through use of a pointer, you are correct.  
  318. Load and display the example program named TWOWAY.C for an 
  319. example of this.
  320.  
  321. In TWOWAY.C, there are two variables defined in the main program, 
  322. pecans and apples.  Notice that neither of these is defined as a 
  323. pointer.  We assign values to both of these and print them out, 
  324. then call the function named fixup() taking both of these values 
  325. along with us.  The variable pecans is simply sent to the 
  326. function, but the address of the variable apples is sent to the 
  327. function.  Now we have a problem.  The two arguments are not the 
  328. same, the second is a pointer to a variable.  We must somehow 
  329. alert the function to the fact that it is supposed to receive an 
  330. integer variable and a pointer to an integer variable.  This 
  331. turns out to be very simple.  Notice that the parameter 
  332. definitions in line 20 defines nuts as an integer, and fruit as 
  333. a pointer to an integer.  The call in the main program therefore 
  334. is now in agreement with the function heading and the program 
  335. interface will work just fine.
  336.  
  337. In the body of the function, we print the two values sent to the 
  338. function, then modify them and print the new values out.  This 
  339. should be perfectly clear to you by now.  The surprise occurs 
  340. when we return to the main program and print out the two values 
  341. again.  We will find that the value of pecans will be restored to 
  342. the value it had prior to the function call because the C 
  343. language makes a copy of the item in question and takes the copy 
  344. to the called function, leaving the original intact as we 
  345. explained earlier.  In the case of the variable apples, we made a 
  346.  
  347.                                                          Page 8-6
  348.  
  349.                                              Chapter 8 - Pointers
  350.  
  351. copy of a pointer to the variable and took the copy of the 
  352. pointer to the function.  Since we had a pointer to the original 
  353. variable, even though the pointer was a local copy, it pointed 
  354. to the original variable and we could change the value of apples 
  355. from within the function.  When we returned to the main program, 
  356. we found a changed value in apples when we printed it out. 
  357.  
  358. This is illustrated graphically in figure 8-8.  The state of the 
  359. system is illustrated following execution of line 25 of the 
  360. program.  The observant student will notice the prototype in 
  361. line 3.  This allows the compiler to check the type of both 
  362. parameters when it gets to line 14 where the function is called.
  363.  
  364. By using a pointer in a function call, we can have access to the 
  365. data in the function and change it in such a way that when we 
  366. return to the calling program, we have a changed value of the 
  367. original variable.  In this example, there was no pointer in the 
  368. main program because we simply sent the address to the function, 
  369. but in many programs you will use pointers in function calls.  
  370. One of the places you will find need for pointers in function 
  371. calls will be when you request data input using standard 
  372. input/output routines.  These will be covered in the next two 
  373. chapters.  Compile and run TWOWAY.C and observe the output.
  374.  
  375.  
  376. POINTERS ARE VALUABLE
  377. -----------------------------------------------------------------
  378. Even though you are probably somewhat intimidated by this time 
  379. about the proper use of pointers, you will find that after you 
  380. gain experience, you will use them profusely in many ways.  You 
  381. will also use pointers in every program you write other than the 
  382. most trivial because they are so useful.  You should probably go 
  383. over this material carefully several times until you feel 
  384. comfortable with it because it is very important in the area of 
  385. input/output which is next on the agenda.
  386.  
  387.  
  388. A POINTER TO A FUNCTION
  389. -----------------------------------------------------------------
  390. Examine the example program named FUNCPNT.C for   ===============
  391. the most unusual pointer yet.  This program          FUNCPNT.C
  392. contains a pointer to a function, and             ===============
  393. illustrates how to use it.  Line 8 of this 
  394. program defines function_pointer as a pointer to a function and 
  395. not to just any function, it points to a function with a single 
  396. formal parameter of type float.  The function must also return 
  397. nothing because of the void before the pointer definition.  The 
  398. parentheses are required around the pointer name as illustrated 
  399. or the system will think it is a prototype definition for a 
  400. function that returns a pointer to void.
  401.  
  402. You will note the prototypes given in lines 4 through 6 that 
  403. declare three functions that use the same parameter and return 
  404.  
  405.                                                          Page 8-7
  406.  
  407.                                              Chapter 8 - Pointers
  408.  
  409. type as the pointer.  Since they are the same as the pointer, the 
  410. pointer can be used to refer to them as is illustrated in the 
  411. executable part of the program.  Line 15 contains a call to the 
  412. print_stuff() function, and line 16 assigns the value of 
  413. print_stuff to function_pointer.  Because the name of a function 
  414. is defined as a pointer to that function, its name can be 
  415. assigned to a function pointer variable.  You will recall that 
  416. the name of an array is actually a pointer constant to the first 
  417. element of the array.  In like manner, a function name is 
  418. actually a pointer constant which is pointing to the function 
  419. itself.  The pointer is successively assigned the address of each 
  420. of the three functions and each is called once or twice as an 
  421. illustration of how a pointer to a function can be used.
  422.  
  423. A function pointer can be passed to another function as a 
  424. parameter and can be used within the function to call the 
  425. function which is pointed to.  You are not permitted to 
  426. increment or add a constant to a function pointer, it can only 
  427. be assigned the value of a function with the same parameters and 
  428. return with which it was initially declared.  It may take you a 
  429. little time to appreciate the value of this construct, but when 
  430. you do understand it, you will see the flexibility built into the 
  431. C programming language.
  432.  
  433. A pointer to a function is not used very often but it is a very 
  434. powerful construct when needed.  You should plan to do a lot of 
  435. C programming before you find a need for this technique.  I 
  436. mention it here only to prevent you being unduly intimidated by 
  437. this difficult concept.  We will continue to study pointers by 
  438. examining their use in additional example programs.
  439.  
  440.  
  441. PROGRAMMING EXERCISES
  442. -----------------------------------------------------------------
  443. 1.  Define a character array and use strcpy() to copy a string 
  444.     into it.  Print the string out by using a loop with a pointer 
  445.     to print out one character at a time. Initialize the pointer 
  446.     to the first element and use the double plus sign to 
  447.     increment the pointer. Use a separate integer variable to 
  448.     count the characters to print.
  449.     
  450. 2.  Modify the program from programming exercise 1 to print out 
  451.     the string backwards by pointing to the end and using a 
  452.     decrementing pointer.
  453.  
  454.  
  455.  
  456.  
  457.  
  458.  
  459.  
  460.  
  461.  
  462.  
  463.                                                          Page 8-8
  464.